/*
 * Elemento.cpp
 *
 *  Created on: 03/04/2010
 *      Author: administrador
 */

#include "Elemento.h"
#include <string>
#include <iostream>
using namespace std;

Elemento::Elemento(Clave clave, string* valor) {
	this-> clave = clave;
	this-> valor = valor;
}

Elemento::Elemento(){

}

Elemento::~Elemento() {

	delete this->valor;
}

Clave Elemento::getClave() {
	return this -> clave;
}

string *Elemento::getValor(){
	return this -> valor;
}

void Elemento::setValor(string* valor) {

	if(this->valor){
		delete this->valor;
	}

	this -> valor = new string(*valor);
}

int Elemento::getTamanio(){

	return (this->clave.getTamanio() + sizeof(int) + (sizeof(char)*this->valor->length()));
}

bool Elemento::operator<(const Elemento &elemento2) {

	if (this->clave < elemento2.clave) {
		return true;
	} else {
		return false;
	}
}

bool Elemento::operator>(const Elemento &elemento2) {

	if (this->clave > elemento2.clave) {
		return true;
	} else {
		return false;
	}
}

bool Elemento::operator==(const Elemento &elemento2) {

	if (this->clave == elemento2.clave) {
		return true;
	} else {
		return false;
	}
}

bool Elemento::operator<=(const Elemento &elemento2) {

	if (this->clave <= elemento2.clave) {

		return true;
	} else {
		return false;
	}
}

bool Elemento::operator>=(const Elemento &elemento2) {

	if (this->clave >= elemento2.clave) {

		return true;
	} else {

		return false;
	}
}

void Elemento::serializar(c_bloque *destino ) {

	if (destino) {

		this->clave.serializar(destino);

		int tamanioValor = this->valor->length();

		destino->add(tamanioValor);

		destino->add((void*)(valor->c_str()), tamanioValor);

	}

}

void Elemento::hidratar(c_bloque *destino ) {

	if (destino) {

		int tamanioValor;

		this->clave = Clave();

		this->clave.hidratar(destino);

		destino->get(&tamanioValor);

		void *buffer_temporal;

		destino->get((void**)&buffer_temporal, tamanioValor);

		this->valor = new string((char*)buffer_temporal,tamanioValor);

	}
}

Elemento* Elemento::clonar()
{
	Elemento* clon = new Elemento();

	clon -> clave = this -> clave;

	clon -> valor = new string(*(this -> valor));

	return clon;
}
